Apache POI匯出Excel的方法相較於JasperReports沒有那麼直觀,沒有GUI介面可以使用,因此Excel中哪一格要顯示什麼值,都要靠單元格的座標(第幾行、第幾列),需要想像一下報表的布局。
Apache POI中,可以由下列的介面來操作Excel。
因此將資料寫入Excel的時候,要知道第幾行、第幾列,以及要寫入什麼資料。
直接由一個範例來看看如何利用這些介面寫入資料。
第一步先查詢要匯出的資料,資料放在StudentCourseScoreReportModel物件中。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentCourseScoreReportModel {
    private String studentNumber;
    private String fullName;
    private String grade;
    private String courseDesc;
    private String departmentDesc;
    private Integer score;
    private String testDate;
}
// 查詢學生考試成績資料資料
List<StudentCourseScoreReportModel> studentCourseScoreReportModelList = reportDemoService.getStudentCourseScoreData();
如果有固定的欄位名稱要顯示,我會先放在一個陣列中。
// 欄位名稱
String[] columnNames = {"學號", "科系", "年級", "姓名", "課程", "成績", "考試日期"};
大致上的步驟如下,第幾步可以對應註解來看:
close()方法釋放資源。Workbook的實現類別,有實作AutoCloseable介面,因此可以用try-with-resources自動關閉createSheet()方法建立工作簿中的試算表,參數為試算表名稱createRow()方法建立試算表中的列,參數就是列數,但是 第一列是從0開始
createCell()方法建立列中的單元格,參數是行數,一樣 第一(直)行是從0開始
createRow()與createCell()的參數都先設為0,以setCellValue()方法設定單元格的值write()方法將ByteArrayOutputStream寫入工作簿,就完成啦try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
     // 1.建立Workbook
     Workbook workbook = new XSSFWorkbook();) {
    // 2.建立excel sheet(參數為sheetname)
    Sheet sheet = workbook.createSheet("學生考試成績表");
    // 3.建立列物件(參數為列數,從0開始)
    Row titleRow = sheet.createRow(0);
    // 4.建立此列的單元格物件
    Cell titleCell = titleRow.createCell(0);
    // 設定cell的內容
    titleCell.setCellValue("XX大學 學生考試成績表");
    // 5.第2列作為欄位名稱
    Row columnTitleRow = sheet.createRow(1);
    for (int k = 0; k < columnNames.length; k++) {
        Cell contentCell = columnTitleRow.createCell(k);
        contentCell.setCellValue(columnNames[k]);
    }
    // 6.遍歷列的資料
    for (int i = 0; i < studentCourseScoreReportModelList .size(); i++) {
        StudentCourseScoreReportModel model = studentCourseScoreReportModelList .get(i);
        // i+2因為第1列是標題,第2列是欄位名稱
        Row contentRow = sheet.createRow(i + 2);
        // 7.行的資料
        for (int j = 0; j < columnNames.length; j++) {
            Cell contentCell = contentRow.createCell(j);
            switch (j) {
                case 0:
                    contentCell.setCellValue(model.getStudentNumber());
                    break;
                case 1:
                    contentCell.setCellValue(model.getDepartmentDesc());
                    break;
                case 2:
                    contentCell.setCellValue(model.getGrade());
                    break;
                case 3:
                    contentCell.setCellValue(model.getFullName());
                    break;
                case 4:
                    contentCell.setCellValue(model.getCourseDesc());
                    break;
                case 5:
                    contentCell.setCellValue(model.getScore());
                    break;
                case 6:
                    contentCell.setCellValue(model.getTestDate());
                    break;
            }
        }
    }
    // 8.寫入ByteArrayOutputStream 匯出Excel
    workbook.write(bos);
} catch (Exception e) {
    // 寫入失敗
    throw new RuntimeException(e);
}
結果就會如下圖
我自己在剛開始接觸Apache POI的時候是覺得以「匯出」這個功能來說,需要想一下才能設定,沒有Jaspersoft Studio直接有畫面來的直覺,如果要做有子報表的那種報表就會很複雜,比較適合較單純的報表匯出。不過Apache POI可以做到讀取Office文件,算是一大優勢。